bitkeeper revision 1.408 (3f5774320u8HbDt_UW94uvftWnuvBA)
authorkaf24@scramble.cl.cam.ac.uk <kaf24@scramble.cl.cam.ac.uk>
Thu, 4 Sep 2003 17:19:46 +0000 (17:19 +0000)
committerkaf24@scramble.cl.cam.ac.uk <kaf24@scramble.cl.cam.ac.uk>
Thu, 4 Sep 2003 17:19:46 +0000 (17:19 +0000)
skbuff.c, dev.c, skbuff.h:
  Fix transmit path for NICs which need a linearised skbuff.

xen/include/xeno/skbuff.h
xen/net/dev.c
xen/net/skbuff.c

index 30d62155eade121518d68537225c2a519009a8a7..a0dbd110a19502ec384f9ce9d5858b21fe43c9dc 100644 (file)
@@ -440,19 +440,20 @@ static inline struct sk_buff *dev_alloc_skb(unsigned int length)
     return __dev_alloc_skb(length, GFP_ATOMIC);
 }
 
+#include <asm/domain_page.h>
+
 static inline void *kmap_skb_frag(const skb_frag_t *frag)
 {
-    return page_address(frag->page);
+    return map_domain_mem(__pa(page_address(frag->page)));
 }
 
 static inline void kunmap_skb_frag(void *vaddr)
 {
+    unmap_domain_mem(vaddr);
 }
 
 extern int skb_copy_bits(const struct sk_buff *skb, 
                          int offset, void *to, int len);
 extern void skb_init(void);
 
-extern int skb_linearize(struct sk_buff *skn, int gfp_mask);
-
 #endif /* _LINUX_SKBUFF_H */
index ca35f5aa661b4939b16b71762312b45ee26c5cb2..83d057a37823948be222bee763e71ff1df521f92 100644 (file)
@@ -733,7 +733,7 @@ static void net_tx_action(unsigned long unused)
 {
     struct net_device *dev = the_dev;
     struct list_head *ent;
-    struct sk_buff *skb;
+    struct sk_buff *skb, *nskb;
     net_vif_t *vif;
     tx_shadow_entry_t *tx;
 
@@ -794,7 +794,11 @@ static void net_tx_action(unsigned long unused)
 
         /* Is the NIC crap? */
         if ( !(dev->features & NETIF_F_SG) )
-            skb_linearize(skb, GFP_KERNEL);
+        {
+            nskb = skb_copy(skb, GFP_KERNEL);
+            kfree_skb(skb);
+            skb = nskb;
+        }
 
         /* Transmit should always work, or the queue would be stopped. */
         if ( dev->hard_start_xmit(skb, dev) != 0 )
index f2cb1e0b81bf54c92051d9a409924bb5a379019c..cf60a573a96e5685bae77cf25036c0cd40521b68 100644 (file)
@@ -430,57 +430,6 @@ struct sk_buff *skb_copy(const struct sk_buff *skb, int gfp_mask)
     return n;
 }
 
-/* Keep head the same: replace data */
-int skb_linearize(struct sk_buff *skb, int gfp_mask)
-{
-       unsigned int size;
-       u8 *data;
-       long offset;
-       int headerlen = skb->data - skb->head;
-       int expand = (skb->tail+skb->data_len) - skb->end;
-
-       if (skb_shinfo(skb)->nr_frags == 0)
-               return 0;
-
-       if (expand <= 0)
-               expand = 0;
-
-       size = (skb->end - skb->head + expand);
-       size = SKB_DATA_ALIGN(size);
-       data = kmalloc(size + sizeof(struct skb_shared_info), gfp_mask);
-       if (data == NULL)
-               return -ENOMEM;
-
-       /* Copy entire thing */
-       if (skb_copy_bits(skb, -headerlen, data, headerlen+skb->len))
-               BUG();
-
-       /* Offset between the two in bytes */
-       offset = data - skb->head;
-
-       /* Free old data. */
-       skb_release_data(skb);
-
-       skb->head = data;
-       skb->end  = data + size;
-
-       /* Set up new pointers */
-       skb->h.raw += offset;
-       skb->nh.raw += offset;
-       skb->mac.raw += offset;
-       skb->tail += offset;
-       skb->data += offset;
-
-       skb->skb_type = SKB_NORMAL;
-
-       /* Set up shinfo */
-       skb_shinfo(skb)->nr_frags = 0;
-
-       skb->tail += skb->data_len;
-       skb->data_len = 0;
-       return 0;
-}
-
 /* Copy some data bits from skb to kernel buffer. */
 
 int skb_copy_bits(const struct sk_buff *skb, int offset, void *to, int len)